"use strict";
// 属性修饰符
//  修饰符              含义                     具体规则
//  public            公开的              可以被：类内部、子类、类外部访问
//  protected         受保护的            可以被：类内部、子类访问
//  private           私有的              可以被：类内部访问
//  readonly          只读属性            属性无法修改
// 1、public   公开的
class ClassPerson {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    speak() {
        console.log(`我叫${this.name},今年${this.age}岁`);
    }
}
class ClassStudent extends ClassPerson {
    study() {
        console.log(`我是${this.name},我正在努力的学习TypeScript!`);
    }
}
const cp1 = new ClassPerson('夜南', 26);
cp1.speak(); //这里speak属性能在类外部被访问到
const cs1 = new ClassStudent('夜南漫剪', 26);
cs1.speak(); //这里speak属性能在子类外部被访问到
cs1.study(); //这里speak属性能在类外部被访问到
// 属性的简写形式：
class EasyWrite {
    constructor(
    // 注意简写形式里修饰符不能省略，不然EasyWrite身上会没有这个属性
    aaa, name, age) {
        this.name = name;
        this.age = age;
        // 这里是不需要再写this.xxx = xxx了
        // this.name = name
        // this.age = age
    }
    speak() {
        console.log(`我叫${this.name},今年${this.age}岁`);
    }
}
const ew1 = new EasyWrite('aaa', '属性简写', 18);
// ew1.aaa  // 报错，因为没有添加修饰符，无法挂载到实例对象身上
console.log('我是属性简写', ew1.name, ew1.age);
// 说白了就是可以在constructor构造器的参数里进行添加属性修饰符，这样就可以不用在constructor同级下定义属性了
// 2、protected   受保护的
class protectedPerson {
    constructor(name, age, address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
    getAddress() {
        console.log(`我家的家庭住址是：${this.address}`);
    }
    getInfo() {
        console.log(`protected受保护的,我是${this.name},今年${this.age}岁`);
    }
}
class protectedStudent extends protectedPerson {
    study() {
        this.getAddress();
    }
}
const protectedStudent1 = new protectedStudent('夜南漫剪', 26, 'xxx省xxx市xxx区');
protectedStudent1.study(); //可以获取到，因为getAddress是在子类里调用的
// protectedStudent1.getAddress()  //报错，因为getAddress是受保护的，无法在外部获取到
// 3、private 私有的
class PersonInfo {
    constructor(name, age, IdCard) {
        this.name = name;
        this.age = age;
        this.IdCard = IdCard;
    }
    getIdCard() {
        return `我的身份证号是:${this.IdCard}`;
    }
    getInfo() {
        return `private私有的,我是${this.name},今年${this.age}岁`;
    }
    getFullInfo() {
        // 在内部可以访问被private修饰的属性和方法
        return this.getInfo() + ',' + this.getIdCard();
    }
}
const pI1 = new PersonInfo('张三', 18, '123654202504185371');
let result = pI1.getFullInfo();
// pI1.getIdCard()      //报错 getIdCard是私有的，只能在内部调用，不能在外部和子类中调用
console.log('private 私有的', result);
class StudentPersonInfo extends PersonInfo {
    study() {
        // return this.getIdCard()   //报错getIdCard是私有的，只能在内部调用，子类中调用
    }
}
// 4、readonly 只读的
class readPerson {
    constructor(name, age, address, IDCard) {
        this.name = name;
        this.age = age;
        this.address = address;
        this.IDCard = IDCard;
    }
    editAddress() {
        // this.address = '太阳系地球村'  ////报错  因为address是只读属性
    }
    editIDCard() {
        // this.IDCard = '123456202504187890'  ////报错  因为IDCard是只读属性
    }
}
const rp1 = new readPerson('李四', 18, 'xxx省xxx市xxx区', '638143202504187953');
console.log('readonly', rp1);
rp1.name = '王五'; //此时rp1实例的name属性从定义时的“李四”更改为了"王五"
console.log('更改后', rp1);
// rp1.age = 19   //报错  因为age是只读属性
